<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<meta name="theme-color" content="#33474d">
	<title>文件系统安全 | 失落的乐章</title>
	<link rel="stylesheet" href="/css/style.css" />
	
      <link rel="alternate" href="/atom.xml" title="失落的乐章" type="application/atom+xml">
    
</head>

<body>

	<header class="header">
		<nav class="header__nav">
			
				<a href="/archives" class="header__link">Archive</a>
			
				<a href="/tags" class="header__link">Tags</a>
			
				<a href="/atom.xml" class="header__link">RSS</a>
			
		</nav>
		<h1 class="header__title"><a href="/">失落的乐章</a></h1>
		<h2 class="header__subtitle">技术面前，永远都是学生。</h2>
	</header>

	<main>
		<article>
	
		<h1>文件系统安全</h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux安全/">Linux安全</a>
			</span>
		
	</div>

	

	
		<h2 id="一、锁定系统重要文件"><a href="#一、锁定系统重要文件" class="headerlink" title="一、锁定系统重要文件"></a>一、锁定系统重要文件</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;系统运维人员有时候可能会遇到通过root用户都不能修改或者删除某个文件的情况，产生这种情况的大部分原因可能是这个文件被锁定了。在Linux下锁定文件的命令是chattr，通过这个命令可以修改ext2、ext3、ext4文件系统下文件属性，但是这个命令必须有超级用户root来执行。和这个命令对应的命令是lsattr，这个命令用来查询文件属性。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;通过chattr命令修改文件或者目录的文件属性能够提高系统的安全性，下面简单介绍下chattr和lsattr两个命令的用法。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;chattr命令的语法格式如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">chattr [-RV] [-v version] [mode] 文件或目录</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;主要参数含义如下：</p>
<ul>
<li>-R：递归修改所有的文件及子目录。</li>
<li>-V：详细显示修改内容，并打印输出。</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其中mode部分用来控制文件的属性，常用参数如下表所示：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;参数含义</p>
<ul>
<li><ul>
<li>：在原有参数设定基础上，追加参数</li>
</ul>
</li>
<li><ul>
<li>：在原有参数设定基础上，移除参数</li>
</ul>
</li>
<li>=：更新为指定参数</li>
<li>a：即append，设定该参数后，只能向文件中添加数据，而不能删除。常用于服务器日志文件安全，只有root用户才能设置这个属性</li>
<li>c：即compresse，设定文件是否经压缩后再存储。读取时需要经过自动解压操作</li>
<li>i ：即immutable，设定文件不能被修改、删除、重命名、设定链接等，同时不能写入或新增内容。这个参数对于文件系统的安全设置有很大帮助</li>
<li>s：安全的删除文件或目录，即文件被删除后硬盘空间被全部收回</li>
<li>u：与s参数相反，当设定为u时，系统会保留其数据块以便以后能够恢复删除这个文件。这些参数中，最常用到的是a和i，a参数常用于服务器日志文件安全设定，而i参数更为严格，不允许对文件进行任何操作，即使是root用户</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;lsattr用来查询文件属性，用法比较简单，其语法格式如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">lsattr [-adlRvV] 文件或目录</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;常用参数如下表所示。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;参数含义</p>
<ul>
<li>-a：列出目录中的所有文件，包括以.开头的文件</li>
<li>-d：显示指定目录的属性</li>
<li>-R：以递归的方式列出目录下所有文件及子目录以及属性值</li>
<li>-v：显示文件或目录版本</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在Linux系统中，如果一个用户以root的权限登录或者某个进程以root的权限运行，那么它的使用权限就不再有任何的限制了。因此，攻击者通过远程或者本地攻击手段获得了系统的root权限将是一个灾难。在这种情况下，文件系统将是保护系统安全的最后一道防线，合理的属性设置可以最大限度地减小攻击者对系统的破坏程度，通过chattr命令锁定系统一些重要的文件或目录，是保护文件系统安全最直接、最有效的手段。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对一些重要的目录和文件可以加上“i”属性，常见的文件和目录有：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">chattr -R +i /bin /boot /lib /sbin</div><div class="line">chattr -R +i /usr/bin /usr/include /usr/lib /usr/sbin</div><div class="line">chattr +i /etc/passwd</div><div class="line">chattr +i /etc/shadow</div><div class="line">chattr +i /etc/hosts</div><div class="line">chattr +i /etc/resolv.conf</div><div class="line">chattr +i /etc/fstab</div><div class="line">chattr +i /etc/sudoers</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对一些重要的日志文件可以加上“a”属性，常见的有：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">chattr +a /var/<span class="built_in">log</span>/messages</div><div class="line">chattr +a /var/<span class="built_in">log</span>/wtmp</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对重要的文件进行加锁，虽然能够提高服务器的安全性，但是也会带来一些不便，例如，在软件的安装、升级时可能需要去掉有关目录和文件的immutable属性和append-only属性，同时，对日志文件设置了append-only属性，可能会使日志轮换(logrotate)无法进行。因此，在使用chattr命令前，需要结合服务器的应用环境来权衡是否需要设置immutable属性和append-only属性。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;另外，虽然通过chattr命令修改文件属性能够提高文件系统的安全性，但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var等目录。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;根目录不能有不可修改属性，因为如果根目录具有不可修改属性，那么系统根本无法工作：/dev在启动时，syslog需要删除并重新建立/dev/log套接字设备，如果设置了不可修改属性，那么可能出问题；/tmp目录会有很多应用程序和系统程序需要在这个目录下建立临时文件，也不能设置不可修改属性；/var是系统和程序的日志目录，如果设置为不可修改属性，那么系统写日志将无法进行，所以也不能通过chattr命令保护。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;虽然通过chattr命令无法保护/dev、/tmp等目录的安全性，但是有另外的方法可以实现，在面将做详细介绍。</p>
<h2 id="二、文件权限检查和修改"><a href="#二、文件权限检查和修改" class="headerlink" title="二、文件权限检查和修改"></a>二、文件权限检查和修改</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;不正确的权限设置直接威胁着系统的安全，因此运维人员应该能及时发现这些不正确的权限设置，并立刻修正，防患于未然。下面列举几种查找系统不安全权限的方法。</p>
<ol>
<li>查找系统中任何用户都有写权限的文件或目录</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;查找文件：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">find / -<span class="built_in">type</span> f -perm -2 -o -perm -20 |xargs ls -al</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;查找目录：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">find / -<span class="built_in">type</span> d -perm -2 -o -perm -20 |xargs ls –ld</div></pre></td></tr></table></figure>
<ol>
<li>查找系统中所有含“s”位的程序</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">find / -<span class="built_in">type</span> f -perm -4000 -o -perm -2000 -<span class="built_in">print</span> | xargs ls –al</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;含有“s”位权限的程序对系统安全威胁很大，通过查找系统中所有具有“s”位权限的程序，可以把某些不必要的“s”位程序去掉，这样可以防止用户滥用权限或提升权限的可能性。</p>
<ol>
<li>检查系统中所有suid及sgid文件</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">find / -user root -perm -2000 -<span class="built_in">print</span> -<span class="built_in">exec</span> md5sum &#123;&#125; \;</div><div class="line">find / -user root -perm -4000 -<span class="built_in">print</span> -<span class="built_in">exec</span> md5sum &#123;&#125; \;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;将检查的结果保存到文件中，可在以后的系统检查中作为参考。</p>
<ol>
<li>检查系统中没有属主的文件</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">find / -nouser -o –nogroup</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;没有属主的孤儿文件比较危险，往往成为黑客利用的工具，因此找到这些文件后，要么删除掉，要么修改文件的属主，使其处于安全状态。</p>
<h2 id="三、-tmp、-var-tmp、-dev-shm安全设定"><a href="#三、-tmp、-var-tmp、-dev-shm安全设定" class="headerlink" title="三、/tmp、/var/tmp、/dev/shm安全设定"></a>三、/tmp、/var/tmp、/dev/shm安全设定</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在Linux系统中，主要有两个目录或分区用来存放临时文件，分别是/tmp和/var/tmp。存储临时文件的目录或分区有个共同点就是所有用户可读写、可执行，这就为系统留下了安全隐患。攻击者可以将病毒或者木马脚本放到临时文件的目录下进行信息收集或伪装，严重影响服务器的安全，此时，如果修改临时目录的读写执行权限，还有可能影响系统上应用程序的正常运行，因此，如果要兼顾两者，就需要对这两个目录或分区就行特殊的设置。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/dev/shm是Linux下的一个共享内存设备，在Linux启动的时候系统默认会加载/dev/shm，被加载的/dev/shm使用的是tmpfs文件系统，而tmpfs是一个内存文件系统，存储到tmpfs文件系统的数据会完全驻留在RAM中，这样通过/dev/shm就可以直接操控系统内存，这将非常危险，因此如何保证/dev/shm安全也至关重要。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对于/tmp的安全设置，需要看/tmp是一个独立磁盘分区，还是一个根分区下的文件夹，如果/tmp是一个独立的磁盘分区，那么设置非常简单，修改/etc/fstab文件中/tmp分区对应的挂载属性，加上nosuid、noexec、nodev三个选项即可，修改后的/tmp分区挂载属性类似如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">LABEL=/tmp     /tmp          ext3    rw,nosuid,noexec,nodev   0 0</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其中，nosuid、noexec、nodev选项，表示不允许任何suid程序，并且在这个分区不能执行任何脚本等程序，并且不存在设备文件。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在挂载属性设置完成后，重新挂载/tmp分区，保证设置生效。<br>对于/var/tmp，如果是独立分区，安装/tmp的设置方法是修改/etc/fstab文件即可；如果是/var分区下的一个目录，那么可以将/var/tmp目录下所有数据移动到/tmp分区下，然后在/var下做一个指向/tmp的软连接即可。也就是执行如下操作：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@server ~]<span class="comment"># mv /var/tmp/* /tmp</span></div><div class="line">[root@server ~]<span class="comment"># ln -s /tmp /var/tmp</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果/tmp是根目录下的一个目录，那么设置稍微复杂，可以通过创建一个loopback文件系统来利用Linux内核的loopback特性将文件系统挂载到/tmp下，然后在挂载时指定限制加载选项即可。一个简单的操作示例如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">[root@server ~]<span class="comment"># dd if=/dev/zero of=/dev/tmpfs bs=1M count=10000</span></div><div class="line">[root@server ~]<span class="comment"># mke2fs -j /dev/tmpfs</span></div><div class="line">[root@server ~]<span class="comment"># cp -av /tmp /tmp.old</span></div><div class="line">[root@server ~]<span class="comment"># mount -o loop,noexec,nosuid,rw /dev/tmpfs /tmp</span></div><div class="line">[root@server ~]<span class="comment"># chmod 1777 /tmp</span></div><div class="line">[root@server ~]<span class="comment"># mv -f /tmp.old/* /tmp/</span></div><div class="line">[root@server ~]<span class="comment"># rm -rf /tmp.old</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;最后，编辑/etc/fstab，添加如下内容，以便系统在启动时自动加载loopback文件系统：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">/dev/tmpfs /tmp ext3 loop,nosuid,noexec,rw 0 0</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;为了验证一下挂载时指定限制加载选项是否生效，可以在/tmp分区创建一个shell文件，操作如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">[root@tc193 tmp]<span class="comment"># ls -al|grep shell</span></div><div class="line">-rwxr-xr-x 1 root root 22 Oct 6 14:58 shell-test.sh</div><div class="line">[root@server ~]<span class="comment"># pwd</span></div><div class="line">/tmp</div><div class="line">[root@tc193 tmp]<span class="comment"># ./shell-test.sh</span></div><div class="line">-bash: ./shell-test.sh: Permission denied</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可以看出，虽然文件有可执行属性，但是已经在/tmp分区无法执行任何文件了。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;最后，再来修改一下/dev/shm的安全设置。由于/dev/shm是一个共享内存设备，因此也可以通过修改/etc/fstab文件设置而实现，在默认情况下，/dev/shm通过defaults选项来加载，对保证其安全性是不够    的，修改/dev/shm的挂载属性，操作如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tmpfs   /dev/shm    tmpfs   defaults,nosuid,noexec,rw  0 0</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;通过这种方式，就限制了任何suid程序，同时也限制了/dev/shm的可执行权限，系统安全性得到进一步提升。</p>

	

	
		<span class="different-posts"><a href="/2017/10/12/Linux安全/14. 文件系统安全/" onclick="window.history.go(-1); return false;">⬅️ Go back </a></span>

	

</article>

	</main>

	<footer class="footer">
	<div class="footer-content">
		
	      <div class="footer__element">
	<p>Hi there, <br />welcome to my Blog glad you found it. Have a look around, will you?</p>
</div>

	    
	      <div class="footer__element">
	<h5>Check out</h5>
	<ul class="footer-links">
		<li class="footer-links__link"><a href="/archives">Archive</a></li>
		
		  <li class="footer-links__link"><a href="/atom.xml">RSS</a></li>
	    
		<li class="footer-links__link"><a href="/about">about page</a></li>
		<li class="footer-links__link"><a href="/tags">Tags</a></li>
		<li class="footer-links__link"><a href="/categories">Categories</a></li>
	</ul>
</div>

	    

		<div class="footer-credit">
			<span>© 2017 失落的乐章 | Powered by <a href="https://hexo.io/">Hexo</a> | Theme <a href="https://github.com/HoverBaum/meilidu-hexo">MeiliDu</a></span>
		</div>

	</div>


</footer>



</body>

</html>
